/**
 * API接口封装
 */
import request from '@/utils/request';
import {upload} from '@/utils/upload.js'


// b3996ac6048b11f0a3500242ac150006
/**
 * 用户认证相关接口
 */
const auth = {
  /**
   * 用户登录
   * @param {string} code - 微信临时登录凭证
   * @returns {Promise} - 返回Promise对象，包含用户信息和token
   */
  login(code) {
    return request.post('/auth/login', { code });
  },
};

/**
 * 数据集和文档管理相关接口
 */
const datasets = {
  /**
   * 获取文档列表
   * @param {string|number} datasetId - 数据集ID
   * @param {Object} params - 查询参数
   * @param {number} [params.page=1] - 页码
   * @param {number} [params.page_size=10] - 每页数量
   * @param {string} [params.orderby] - 排序字段
   * @param {boolean} [params.desc] - 是否降序排列
   * @param {string} [params.keywords] - 搜索关键词
   * @param {string|number} [params.id] - 按文档ID筛选
   * @param {string} [params.name] - 按文档名称筛选
   * @returns {Promise} - 返回Promise对象，包含文档列表和分页信息
   */
  getDocuments(params = {}) {
    // 设置默认参数
    const defaultParams = {
      page: 1,
      page_size: 20
    };
    
    // 合并参数
    const queryParams = {
      ...defaultParams,
      ...params
    };
    
    // 使用v1版本的API
    return request.get(`/datasets/${params.datasetId}/documents`, queryParams, { v1: true });
  },
  
  /**
   * 上传文档到指定数据集
   * @param {string} uploadFileName - 数据集ID
   * @param {Array|string} filePath - 文件本地路径或文件数组
   * @returns {Promise} - 返回Promise对象，包含上传结果
   */
  uploadDocument(filePath,uploadFileName) {
    // 检查是否为单个文件路径(字符串)还是文件数组
    if (typeof filePath === 'string') {
      // 单文件上传
      return request.upload({
        url: `/knowledge/uploadDocuments?fileName=${uploadFileName}`,
        filePath: filePath,
        name: 'file',
        formData: {},
      });
    } else if (Array.isArray(filePath)) {
      // 这里我们会自行构建一个multipart/form-data请求
      // 但由于uni-app不直接支持多文件上传，我们需要一个一个上传
      
      // 创建一个Promise数组来跟踪所有上传
      const uploads = filePath.map(file => {
        // 如果是对象格式(包含path属性)
        const path = typeof file === 'object' ? file.uri || file.path : file;
        
        return request.upload({
          url: `/knowledge/uploadDocuments`,
          filePath: path,
          name: 'file',
          formData: {},
        });
      });
      
      // 返回Promise.all，等待所有上传完成
      return Promise.all(uploads);
    } else {
      return Promise.reject(new Error('无效的文件参数'));
    }
  },

  /**
   * 删除指定数据集中的文档
   * @param {string|number} datasetId - 数据集ID
   * @param {string|number} documentId - 文档ID
   * @returns {Promise} - 返回Promise对象，包含删除结果
   */
  deleteDocument(datasetId, documentId) {
    // 使用v1版本的API
    return request.delete(`/datasets/${datasetId}/documents/${documentId}`, {}, { v1: true });
  },

  /**
   * 删除指定数据集中的文档
   * @param {string|number} datasetId - 数据集ID
   * @param {string|number} documentId - 文档ID
   * @returns {Promise} - 返回Promise对象，包含删除结果
   */
  parseDocument(datasetId, documentIds) {
    // 使用v1版本的API
    return request.post(`/datasets/${datasetId}/chunks`, {document_ids:documentIds}, { v1: true });
  },
  
  /**
   * 批量删除指定数据集中的文档
   * @param {string|number} datasetId - 数据集ID
   * @param {Array<string>} ids - 文档ID数组
   * @returns {Promise} - 返回Promise对象，包含删除结果
   */
  batchDeleteDocuments(datasetId, ids) {
    // 使用v1版本的API，通过POST请求体传递要删除的文档ID数组
    return request.delete(`/datasets/${datasetId}/documents`, { ids }, { v1: true });
  }
};

/**
 * 聊天相关接口
 */
const chats = {
  /**
   * 发送聊天信息
   * @param {string} chatId - 聊天ID
   * @param {Object} params - 请求参数
   * @param {string} params.question - 用户问题
   * @param {boolean} [params.stream=false] - 是否使用流式返回
   * @param {string} [params.session_id] - 会话ID（可选）
   * @param {string} [params.user_id] - 用户ID（可选）
   * @returns {Promise} - 返回Promise对象，包含聊天完成结果
   */
  setChatCompletion(chatId, params) {    
    // 使用v1版本的API
    return request.post(`/chats/${chatId}/completions`, params, { v1: true,enableChunked: true });
  },

  /**
   * 获取聊天历史记录列表
   * @param {string} chatId - 聊天ID
   * @param {Object} params - 请求参数
   * @returns {Promise} - 返回Promise对象，包含聊天完成结果
   */
  getMessageList(params) {
    if (params.enableWebSearch) {
      return request.get(`/agents/${params.agentId}/sessions`, params, { v1: true}); 
    } else {
      return request.get(`/chats/${params.chatId}/sessions`, params, { v1: true}); 
    }
  },

  /**
   * 获取模型列表
   * @returns {Promise} - 返回Promise对象，包含模型列表
   */
  getModelList() {
    return request.get(`/model/list`, {});
  },

  /**
   * 切换当前模型
   * @param {string} modelName - 模型名称
   * @param {boolean} enableWebSearch - 是否联网
   * @returns {Promise} - 返回Promise对象，包含模型列表
   */
  updateModel(modelName, enableWebSearch) {
    if (enableWebSearch) {
      return request.post(`/model/update-agent-model`, {model:modelName,chatId:uni.getStorageSync('chatId')});
    } else {
      return request.post(`/model/update-model`, {model:modelName,chatId:uni.getStorageSync('chatId')});
    }
  },

  /**
   * 清除消息
   * @param {Object} params - 请求参数
   * @param {string} params.sessionId - 聊天ID
   * @param {string} params.agentSessionId - 聊天ID
   * @param {boolean} params.enableWebSearch - 是否开启联网
   * @returns {Promise} - 返回Promise对象，包含sessionId
   */
  cleanMessage(params) {
    if (params.enableWebSearch) {
      return request.get(`/model/clear-agent-session`, {agentSessionId:params.agentSessionId});
    } else {
      return request.get(`/model/clear-session`, {sessionId:params.sessionId});
    }
  }
};

/**
 * 语音服务相关借口
 */
const voice = {
  // 语音转文字
	voiceToText: (tempFilePath) => {
		return new Promise((resolve,reject) => {
			upload({
				url: 'http://192.168.0.10:8080/api/speech-recognition/upload',
				fileType: 'all',
				maxSize: 10, // 10MB,
				tempFilePath
      }).then(async res => {
        try {
          const data = await request.post(`/speech-recognition/speechUrl`, {speechUrl:res.data},);
          resolve(data)
        } catch (error) {
          reject(error)
        }
      }).catch(err => {
        reject(err)
      })
		});
	}
}

// 导出所有API
export default {
  auth,
  datasets,
  chats,
  voice
};
